<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
      函数是什么?
      函数也是对象
      函数的定义与调用
      函数的内存结构
      */
      /* 
      函数是什么?
        多条语句的封装体, 实现多条语句复用
      */
      function showResult (score) {
        if (score>=60) {
          alert('直接通过')
        } else if (score>=50) {
          alert('需要2周后复试')
        } else {
          alert('不能入学')
        }
      }

      // showResult(70)
      // showResult(55)
      // showResult(40)

      /* 
      函数也是对象
      1. 看它是不是Object类型
      2. 看它有没有对象的特性: 有属性或方法
      */
      console.log(showResult instanceof Object) // true
      
      console.log(showResult.prototype) // 有属性
      showResult.call({}, 50)  // 从语法来看是调用showResult的对象的call方法
      // 在功能来说: 调用showResult函数, 并指定this为第一个参数


      /* 
      函数的定义与调用
      语句: 
        语句是最小的个单元指令
        可以单独存在
        以分号结尾, 但分号可以省略
      表达式:  
        数据 / 变量 / 数据和变量的计算
        表达式不是条完整的指令, 表达式不能单独存在, 需要与别的操作符组合形成语句
        没有分号
      */
      // 函数声明
      function fn1() {
        
      }
      // 函数表达式
      const fn2 = function () {
        
      }

      var a = 3
      var b = a
      var c = a + 3

      var d = function () {
        
      }

      (function () {
        
      })();

      var e = fn()
      a  // 之所以不报错, 会自动添加分号

      /* 
      函数的内存结构
        函数本身是Function的实例对象, 而函数名, 就是指向函数对象的一个引用变量
      */
    </script>
  </body>
</html>
